<?php if(!defined('BASEPATH')) exit('No direct script access allowed');


/**
 * Mail gönderim kuyruğunu işler.
 * Kuyrukta bekleyen mailleri gönderir.OB
 * 
 * @author Ali OYGUR <alioygur@gmail.com>
 * @date 2012-03-12
 */
class Sender
{
	// CI supper global
	private $ci;

	// Mail Send Limit
	private $sendLimit;

	public function __construct()
	{
		$this->init();
	}
	
	/**
	 * Initialize
	 */
	private function init()
	{
		// instance of ci
		$this->ci = & get_instance();

		// set mail send limit
		$this->sendLimit = setting('company', 'send_limit', 100); // default 100

		// load CI email library
		$this->ci->load->library('email');

		// load encrypt library
		$this->ci->load->library('encrypt');
	}
	
	/**
	 * Send mail at queue
	 */
	public function processQueue()
	{
		// oluşturulmuş olan kampanya bilgililerini çekiyoruz
		$q = $this->ci->db
			->select('*')
			->from('sent AS s')
			->where(array(
				's.status' => '2' // durumu devam ediyor olan
			))
			->order_by('s.id', 'asc')
			->limit(1)
			->get();
		
		// herhangi bir kayıt yoksa işlemi durdur.
		if(!$q->num_rows()) return NULL;

		$sent = $q->row();

		// mail içeriği db ye base64 ile şifrelenmiş bir şekilde kayıt edilir
		// gönderim öncesinde bu şifre deşifre ediliyor
		$message = base64_decode($sent->content);

		$send_data = array(
			'from_name' => $sent->from_name,
			'from_email' => $sent->from_email,
			'reply_name' => $sent->reply_name,
			'reply_email' => $sent->reply_email,
			'to_name' => null,
			'to_email' => null,
			'subject' => $sent->subject,
			'message' => $message,
			'attach' => $sent->attach
		);
		
		// Kampanyaya ait 
		// kuyrukta bekleyen mailleri çekiyoruz
		
		// Kullanıcının kredisi göderim limitinden fazla ise limit kadar mail çekiyoruz
		// yoksa kullanıcının kredisinin yettiği kadar mailini çekiyoruz.
		$user_credit = $this->ci->auth->get_credit($sent->user_id);
		$limit = ($user_credit > $this->sendLimit)? $this->sendLimit : $user_credit;
		
        $q = $this->ci->db
			->select('
				si.id,
				si.sent_id,
				si.group_id,
				si.firstname,
				si.lastname,
				si.address
				')
            ->from('sent_item AS si')
            ->where(array(
				'si.send_attempt' => '0',
				'si.sent_id' => $sent->id
                ))
            ->order_by('si.id', 'asc')
            ->limit($limit)
            ->get();
		
		$total_rows = $q->num_rows();
		
		// Gönder
		// gönderilen kayıtları kayıt ediyoruz daha sonra bu gönderdiklerimizi
		// gönderildi olarak işaretliyeceğiz
		$sends = array();
        if($total_rows > 0)
        {
            $result = $q->result();

            foreach($result as $row)
            {
				// id yi şifreliyip token olarak kullanıyoruz
				$token = $this->ci->encrypt->encode($row->id);
				$token = urlencode($token);

				$sends[] = $row->id;
				
				$send_data['to_name'] = $row->firstname.' '.$row->lastname;
				$send_data['to_email'] = $row->address;
				$send_data['message'] = $this->prepareMailContent($message, $token);
				$this->send($send_data);
            }
        }
		
		// Kullanıcının kredisinden gönderilen mailler düşülüyor
		$this->ci->user_credit_model->decrease($sent->user_id, $total_rows);
		
		// Mailler gönderildi. Şimdi gönderilen mailleri gönderildi olarak işaretleyeceğiz. 
		if(count($sends) > 0)
		{
			$this->ci->db
				->where_in('id', $sends)
				->update('sent_item', array('send_attempt' => '1', 'is_send' => '1'));
		}
		
		// Tüm mailler komple gönderildimi?
		// Veya kullanıcının kredisi tükendimi kontrol edeceğiz.
		$i = $this->ci->db
			->where(array(
				'send_attempt' => '0',
				'sent_id' => $sent->id
				))
			->count_all_results('sent_item');
		
		if($i > 0 AND !$this->ci->auth->get_credit())
		{
			// hala gönderilmesi gereken mail var ancak kullanıcının kredisi bittiyse kampanyayı durduruyoruz.
			$this->ci->db->update('sent', array('status' => '0', 'notice' => 'Krediniz tükendi. Lütfen kredi yükleyiniz.'), array('id' => $sent->id));
		}
		if(!$i)
		{
			// Kuyrukta bekleyen mail kalmadı kampanya durumunu tamamlandı olarak ayarlıyoruz.
			$this->ci->db->update('sent', array('status' => '1', 'notice' => 'Gönderim Tamamlandı.'), array('id' => $sent->id));
		}
	}
	
	/**
	 * Mail içeriğini gönderime hazırlar
	 * varsa değişkenlerin içeriğini doldurur
	 * mail altına okundu bilgisini almak ve abonelikten çıkmak için bağlantılar ekler
	 * @param string
	 * @param string
	 * @return string
	 */
	private function prepareMailContent($content, $token)
	{
		//$update_url      = site_url("main/update/?token={$token}");
        $unsubscribe_url = site_url("main/unsubscribe/?token={$token}");
		
        $content .= "<p>Artık bizden e posta almak istemiyorsanız lütfen <a href=\"{$unsubscribe_url}\">buraya</a> tıklayınız.</p>";
        //$content .= "<p>Click here to <a href=\"{$unsubscribe_url}\">unsubscribe</a> from this mailing list.</p>";
        //$content .= "<p><img src=\"{$update_url}\" /></p>";

        return $content;
	}

	/**
	 * Send an email
	 * @param object 
	 */
	private function send($data)
	{
		$default = array(
			'from_name' => setting('mail', 'from_name'),
			'from_email' => setting('mail', 'from_email')
		);
	
		$data = array_merge($default, $data);
	
		$this->ci->email->clear();
	
		$this->ci->email->from($data['from_email'], $data['from_name']);
		if(isset($data['reply_email']))
			$this->ci->email->reply_to($data['reply_email'], $data['reply_name']);
		$this->ci->email->to($data['to_email']);
		$this->ci->email->subject($data['subject']);
		$this->ci->email->message($data['message']);
	
		// ataç dosya varsa
		if (!empty($data['attach']))
			$this->ci->email->attach($data['attach']);
	
		$this->ci->email->send();		
	}
}

/* End of file sender.php */
